package br.com.controlador;

import br.com.modelo.*;
import br.com.nfe.CalculaImposto;
import br.com.nfe.DadosNfeController;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import util.Biblioteca;
import util.JPAUtil;
import util.JSFUtil;

/**
 *
 * @author gilberto.costa
 */
@ManagedBean
@ViewScoped
public class VendaControler implements Serializable {

    private VendaCabecalho vendaCabecalho;
    private VendaCabecalho[] listVendaCabecalhoSelecionados;
    private List<VendaCabecalho> listVendaCabecalho;

    @PostConstruct
    public void init() {
        vendaCabecalho = new VendaCabecalho();
        listVendaCabecalho = JPAUtil.buscarTodos(VendaCabecalho.class);
    }

    /**
     * @return the vendaCabecalho
     */
    public VendaCabecalho getVendaCabecalho() {
        return vendaCabecalho;
    }

    /**
     * @param vendaCabecalho the vendaCabecalho to set
     */
    public void setVendaCabecalho(VendaCabecalho vendaCabecalho) {
        this.vendaCabecalho = vendaCabecalho;
    }

    /**
     * @return the listVendaCabecalho
     */
    public List<VendaCabecalho> getListVendaCabecalho() {
        return listVendaCabecalho;
    }

    /**
     * @param listVendaCabecalho the listVendaCabecalho to set
     */
    public void setListVendaCabecalho(List<VendaCabecalho> listVendaCabecalho) {
        this.listVendaCabecalho = listVendaCabecalho;
    }

    public void ver() {
        for (VendaCabecalho v : getListVendaCabecalhoSelecionados()) {
            System.out.println(v.getId());
        }
    }

    /**
     * @return the listVendaCabecalhoSelecionados
     */
    public VendaCabecalho[] getListVendaCabecalhoSelecionados() {
        return listVendaCabecalhoSelecionados;
    }

    /**
     * @param listVendaCabecalhoSelecionados the listVendaCabecalhoSelecionados
     * to set
     */
    public void setListVendaCabecalhoSelecionados(VendaCabecalho[] listVendaCabecalhoSelecionados) {
        this.listVendaCabecalhoSelecionados = listVendaCabecalhoSelecionados;
    }

    public void pegaItemSelecionado() {
        if (listVendaCabecalhoSelecionados.length == 0) {
            JSFUtil.addMessageErro("Selecione pelo menos uma venda!");
        } else if (listVendaCabecalhoSelecionados.length >= 2) {
            JSFUtil.addMessageErro("Selecione apenas 1 item");
        } else {
            VendaCabecalho venda = JPAUtil.buscarPorId(VendaCabecalho.class, listVendaCabecalhoSelecionados[0].getId());
            vendaCabecalho = venda;
            org.primefaces.context.RequestContext.getCurrentInstance().execute("ItensVenda.show();");
        }
    }

    public void emitirNF_e() {
        if (listVendaCabecalhoSelecionados.length == 0) {
            JSFUtil.addMessageErro("Selecione pelo menos uma venda!");
        } else if (listVendaCabecalhoSelecionados.length >= 2) {
            JSFUtil.addMessageErro("Selecione apenas 1 item!");
        } else {
            VendaCabecalho venda = JPAUtil.buscarPorId(VendaCabecalho.class, listVendaCabecalhoSelecionados[0].getId());
            if (venda.getPossui_nfe().equalsIgnoreCase("S")) {
                JSFUtil.addMessageErro("Esta venda já possui Nota!");
            } else {
                transformaVendaEmNota(venda);
                listVendaCabecalho = JPAUtil.buscarTodos(VendaCabecalho.class);
            }
        }
    }

    public void transformaVendaEmNota(VendaCabecalho venda) {
        try {
            NfeCabecalho nfe = new NfeCabecalho();
            nfe.setCliente(venda.getCliente());
            nfe.setCodigoMunicipio(Integer.parseInt(venda.getCliente().getIdCidade().getCodIBGE().substring(0, 2)));
            nfe.setDataEmissao(new Date());
            nfe.setIdFuncionario(venda.getFuncionario().getId());
            nfe.setBaseCalculoIcms(venda.getBaseIcms());
            nfe.setValorCofins(venda.getCofins());
            nfe.setValorTotal(venda.getValorVenda());
            nfe.setValorPis(venda.getPis());
            nfe.setValorIssqn(venda.getIssqn());
            nfe.setVenda(venda);
            nfe.setCodigoNumerico("00000001");
            nfe.setNaturezaOperacao("Venda de Mercadoria");
            nfe.setIndicadorFormaPagamento('0');
            nfe.setCodigoModelo("55");
            nfe.setSerie("000");
            nfe.setNumero(NfeCabecalho.retornaUltimoNumeroNota());
            nfe.setDataEntradaSaida(new Date());
            nfe.setTipoEmissao('1');
            nfe.setVersaoProcessoEmissao(100);
            nfe.setFinalidadeEmissao('1');
            nfe.setTipoOperacao('1');
            nfe.setFormatoImpressaoDanfe('1');
            nfe.setBaseCalculoIcmsSt(BigDecimal.ZERO);
            nfe.setValorIcmsSt(BigDecimal.ZERO);
            nfe.setValorTotalProdutos(venda.getValorVenda());
            nfe.setValorFrete(BigDecimal.ZERO);
            nfe.setValorSeguro(BigDecimal.ZERO);
            nfe.setValorDesconto(BigDecimal.ZERO);
            nfe.setValorIpi(BigDecimal.ZERO);
            nfe.setValorDespesasAcessorias(BigDecimal.ZERO);


            Empresa empresa = JPAUtil.buscarPorId(Empresa.class, 1);
            nfe.setEmpresa(empresa);

            SimpleDateFormat formatoData = new SimpleDateFormat("yyMM");
            String chave = empresa.getCodigoIbgeCidade().substring(0, 2)  //  2
                    + formatoData.format(new Date())                      //  4 
                    + empresa.getCnpj()                                   // 14 
                    + nfe.getCodigoModelo()//nmodelo                      //  2
                    + nfe.getSerie()//serie nota                          //  3 
                    + nfe.getNumero()//numero                             //  9
                    + "1"                                                 //  1 
                    + nfe.getCodigoNumerico();//codigo numero             //  8
            Integer digitaChave = Biblioteca.modulo11(chave);             //  1

            nfe.setChaveAcesso(chave + digitaChave.toString());
            nfe.setDigitoChaveAcesso(digitaChave.toString());
            //itens da nota

            for (VendaDetalhe v : venda.getVendaDetalheList()) {
                NfeDetalhe nfe_det = new NfeDetalhe();
                nfe_det.setProduto(v.getProduto());
                nfe_det.setNomeProduto(v.getProduto().getDescricao());
                nfe_det.setNcm(v.getProduto().getNcm());
                nfe_det.setValorBrutoProdutos(v.getValorTotal());
                nfe_det.setQuantidadeComercial(v.getQuantidade());
                nfe_det.setValorUnitarioComercial(v.getValorUnitario());
                nfe_det.setValorTotal(v.getValorTotal());
                nfe_det.setAliquotaIcms(v.getProduto().getTaxaIcms());
                nfe_det.setCfop(v.getCfop());
                nfe_det.setCsosn("0" + v.getCst());
                nfe_det.setCstIcms(v.getCst());
//              nfe_det.setCstCofins(v.getCst());
//              nfe_det.setCstIcms(v.getCst());
//              nfe_det.setCstIpi(v.getCst());
                nfe_det.setGtin(v.getProduto().getGtin());
//              nfe_det.setGtinUnidadeTributavel(v.getProduto().getIdUnidadeProduto().getNome());
                nfe_det.setNumeroItem(v.getItem());
                nfe_det.setBaseCalculoIcms(v.getBaseIcms());
                nfe_det.setValorIcms(v.getIcms());
                nfe_det.setValorDesconto(v.getDesconto());
                nfe_det.setValorIssqn(v.getIssqn());
                nfe_det.setValorPis(v.getPis());
                nfe_det.setValorCofins(v.getCofins());
                nfe_det.setValorIpi(v.getPis());
                nfe_det.setIdNfeCabecalho(nfe);
                nfe_det.setQuantidadeTributavel(v.getQuantidade());
                nfe_det.setValorUnitarioTributacao(v.getValorUnitario());
                nfe.getNfeDetalheList().add(nfe_det);
            }

            nfe = CalculaImposto.efetuaCalculosDetalhe(nfe.getNfeDetalheList(), empresa.getCrt(), true, nfe);
            nfe = nfe.salvar();

            //alterando venda como: já emitida
            venda.setPossui_nfe("S");
            venda = venda.salvar();

            //enviando a nf-e
            DadosNfeController dadosNfeControl = new DadosNfeController();
            dadosNfeControl.enviaNfe(nfe);
            JSFUtil.addMessageSucesso("Nota Salva!");
        } catch (Exception e) {
            JSFUtil.addMessageErro("Erro ao salvar Nota: " + e);
            System.out.println(e);
        }
    }
}
